home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / spotlite.e < prev    next >
Text File  |  1993-12-13  |  27KB  |  965 lines

  1. /* SpotLite v0.04 - © 1993 by Leon Woestenberg (leon@stack.urc.tue.nl) */
  2.  
  3. /* FOLDER "Modules" */
  4. /* ~~~~~~~~~~~~~~~~ */
  5.  
  6. MODULE 'intuition/intuition'
  7. MODULE 'intuition/screens'
  8. MODULE 'intuition/gadgetclass'
  9. MODULE 'graphics/displayinfo'
  10. MODULE 'graphics/text'
  11. MODULE 'gadtools'
  12. MODULE 'libraries/gadtools'
  13. MODULE 'exec/ports'
  14.  
  15. /* FEND */
  16. /* FOLDER "Globals" */
  17. /* ~~~~~~~~~~~~~~~~ */
  18.  
  19. /* Prefs constant */
  20. CONST WBSCREEN=TRUE
  21.  
  22. /* tagitems for newlook menus */
  23. CONST WFLG_NEWLOOKMENUS=$200000
  24. CONST GTMN_NEWLOOKMENUS=$80080043
  25.  
  26. /* menu item id's */
  27. ENUM MENU_LOAD,MENU_SAVE,MENU_ABOUT,MENU_QUIT,MENU_LAST
  28.  
  29. /* screen info */
  30. DEF screen:PTR TO screen
  31. DEF visual
  32. DEF topaz:PTR TO textattr
  33. /* slider format string */
  34. DEF format[6]:STRING
  35.  
  36. /* main window objects */
  37. DEF mainwindow:PTR TO window
  38. DEF mainmenus:PTR TO menu
  39. DEF maingadgetlist=0:PTR TO gadget
  40. ENUM GADID_RESET,GADID_STRING,GADID_SLIDER,NUM_MAINGADGETS
  41. DEF maingadget[NUM_MAINGADGETS]:ARRAY OF LONG
  42.  
  43. /* slider window objects */
  44. DEF sliderwindow:PTR TO window
  45. DEF slidermenus:PTR TO menu
  46. DEF slidergadgetlist=0:PTR TO gadget
  47. CONST NUM_SLIDERS=23
  48. DEF slidergadget[NUM_SLIDERS]:ARRAY OF LONG
  49. DEF slidervalue[NUM_SLIDERS]:ARRAY OF CHAR
  50.  
  51. /* waitstate terminator */
  52. DEF quitflag=FALSE
  53.  
  54. /* FEND */
  55. /* FOLDER "Editables" */
  56.  
  57. /* Inside window left-top point */
  58. CONST WIN_TOP=11,WIN_LEFT=4,WIN_BOTTOM=10
  59.  
  60. /* keep (SLI_WIDTH-8) a multiply of ten to keep a neat scale display */
  61.  
  62. /* slider offset from boxes, slider sizes and gaps between sliders */
  63. CONST SLI_XOFF=0,SLI_YOFF=0,SLI_WIDTH=16,SLI_GAP=0
  64. DEF sli_height=78
  65.  
  66. /* box offset from left top of window area, and box size calculation */
  67. CONST BOX_XOFF=4,BOX_YOFF=2
  68.  
  69. /* gap between boxes, keep ten or higher to have neat scale display */
  70. CONST BOX_GAP=20
  71.  
  72. /* FEND                           */
  73. /* FOLDER "Exceptions" */
  74. /* ~~~~~~~~~~~~~~~~~~~ */
  75.  
  76. /* no error exception */
  77. ENUM EXCEPT_NOERROR,
  78.  
  79. /* xOpenScreen exceptions */
  80. ERROR_NOSCREEN=0,ERROR_NOWBSCREEN,ERROR_NOVISUAL,
  81.  
  82. /* xOpenWindow exceptions */
  83. ERROR_NOWINDOW=0,ERROR_NOMENUSTRIP,
  84.  
  85. /* xCreateGadgets exceptions */
  86. ERROR_NOCONTEXT=0,ERROR_NOGADGET,
  87.  
  88. /* xCreateMenus exceptions */
  89. ERROR_NOMENUS=0,ERROR_NOLAYOUT,
  90.  
  91. /* xOpenLibraries exceptions */
  92. ERROR_NOGADTOOLS=0
  93.  
  94. /* FEND */
  95.  
  96. /* FOLDER "Main" */
  97. PROC main()
  98.  
  99.   /* version info (<alt space> between name and version) */
  100.   VOID '$VER: SpotLite 0.04 © 1993 by Leon Woestenberg'
  101.  
  102.   /* set topaz text attributes */
  103.   topaz:=['topaz.font',8,0,FPF_ROMFONT]:textattr
  104.  
  105.   /* set level format */
  106.   /* format:='%03lu' */
  107.   format := '\z\d[03]'
  108.  
  109.   /* present interface */
  110.   IF xOpenSpotLiteLibraries()
  111.     IF xOpenSpotLiteScreen()
  112.       IF xOpenMainWindow()
  113.         IF xOpenSliderWindow()
  114.  
  115.           /* handle input */
  116.           xWaitForSignals()
  117.  
  118.           /* until user quits */
  119.           xCloseSliderWindow()
  120.         ENDIF
  121.         xCloseMainWindow()
  122.       ENDIF
  123.       xCloseSpotLiteScreen()
  124.     ENDIF
  125.     xCloseSpotLiteLibraries()
  126.   ENDIF
  127. ENDPROC
  128. /* FEND */
  129. /* FOLDER "Wait for Signals" */
  130. PROC xWaitForSignals()
  131.   
  132.   /* signal bitmasks */
  133.   DEF mainmask,slidermask,signalmask
  134.   DEF port:PTR TO mp
  135.  
  136.     /* create signal bitmasks */
  137.  
  138.     /* mainwindow open? */
  139.     IF mainwindow
  140.       port:=mainwindow.userport
  141.       mainmask:=Shl(1,port.sigbit)
  142.     ELSE
  143.       mainmask:=0
  144.     ENDIF
  145.     /* sliderwindow open? */
  146.     IF sliderwindow
  147.       port:=sliderwindow.userport
  148.       slidermask:=Shl(1,port.sigbit)
  149.     ELSE
  150.       slidermask:=0
  151.     ENDIF
  152.  
  153.   /* quit? */
  154.   WHILE quitflag=FALSE
  155.  
  156.     /* wait for wanted signals */
  157.     signalmask:=Wait(mainmask OR slidermask)
  158.  
  159.     /* check for signals, and act if set */
  160.     IF (mainmask AND signalmask) THEN xHandleMainMessages()
  161.     IF (slidermask AND signalmask) THEN xHandleSliderMessages()
  162.  
  163.   ENDWHILE
  164. ENDPROC
  165. /* FEND */
  166.  
  167. /* FOLDER "Screen" */
  168. /* FOLDER "Open" */
  169. PROC xOpenSpotLiteScreen()
  170.   IF WBSCREEN
  171.     IF xLockWorkbenchScreen() THEN RETURN TRUE
  172.   ELSE
  173.     IF xOpenCustomScreen() THEN RETURN TRUE
  174.   ENDIF
  175. ENDPROC
  176. PROC xCloseSpotLiteScreen()
  177.   IF WBSCREEN
  178.     xUnlockWorkbenchScreen()
  179.   ELSE
  180.     xCloseCustomScreen()
  181.   ENDIF
  182. ENDPROC
  183. /* FEND */
  184. /* FOLDER "Custom" */
  185. PROC xOpenCustomScreen() HANDLE
  186.  
  187.   /* open a custom screen */
  188.   screen:=xCall(OpenScreenTagList(0,
  189.     [SA_WIDTH,STDSCREENWIDTH,
  190.      SA_HEIGHT,STDSCREENHEIGHT,
  191.      SA_TYPE,CUSTOMSCREEN,
  192.      SA_TITLE,'SpotLite v0.03 © 1993 by Leon Woestenberg',
  193.      SA_DISPLAYID,HIRES_KEY,
  194.      SA_FONT,topaz,
  195.      SA_DEPTH,2,
  196.      0,0]),ERROR_NOSCREEN)
  197.  
  198.   /* get screen private info for gadtools */
  199.   visual:=xCall(GetVisualInfoA(screen,NIL),ERROR_NOVISUAL)
  200.  
  201.   /* opening screen succeeded */
  202.   RETURN TRUE
  203. EXCEPT
  204.  
  205.   /* cleanup */
  206.   xCloseCustomScreen()
  207.  
  208.   /* inform user */
  209.   xExceptionMessage(['Could not open custom screen.',
  210.                      'Could not get screen visual info.'])
  211. ENDPROC
  212. PROC xCloseCustomScreen() /* "xCloseScreen" */
  213.  
  214.   /* visual info? */
  215.   IF visual
  216.     /* free visual info */
  217.     FreeVisualInfo(visual)
  218.     visual:=0
  219.   ENDIF
  220.  
  221.   /* screen open? */
  222.   IF screen
  223.     /* close screen */
  224.     IF CloseScreen(screen)=FALSE
  225.       /* screen has windows */
  226.       /* IF SO, THIS IS BUG */
  227.       exception:=EXCEPT_NOERROR
  228.       xExceptionMessage(['Screen contains at least one window.\nPlease report this error to author.'])
  229.     ELSE
  230.       screen:=0
  231.     ENDIF
  232.   ENDIF
  233. ENDPROC
  234. /* FEND */
  235. /* FOLDER "Workbench" */
  236. PROC xLockWorkbenchScreen() HANDLE
  237.   screen:=xCall(LockPubScreen('Workbench'),ERROR_NOWBSCREEN)
  238.   visual:=xCall(GetVisualInfoA(screen,NIL),ERROR_NOVISUAL)
  239.   RETURN TRUE
  240. EXCEPT
  241.   xUnlockWorkbenchScreen()
  242.   xExceptionMessage(['Could not lock Workbench screen',
  243.                      'Could not get screen visual info'])
  244. ENDPROC
  245. PROC xUnlockWorkbenchScreen()
  246.   IF visual
  247.     FreeVisualInfo(visual)
  248.     visual:=0
  249.   ENDIF
  250.   IF screen
  251.     UnlockPubScreen(NIL,screen)
  252.     screen:=0
  253.   ENDIF
  254. ENDPROC
  255. /* FEND */
  256. /* FEND */
  257. /* FOLDER "Main Window" */
  258. /* ~~~~~~~~~~~~~~~~~~~~ */
  259. /* FOLDER "Open" */
  260. PROC xOpenMainWindow() HANDLE
  261.  
  262.   /* gadgets made? */
  263.   IF xCreateMainGadgets()
  264.  
  265.     /* menus made? */
  266.     IF xCreateMainMenus()
  267.  
  268.       /* open window */
  269.       mainwindow:=xCall(OpenWindowTagList(NIL,
  270.  
  271.         /* window position and size */
  272.        [WA_LEFT,45,WA_TOP,28,WA_WIDTH,376,WA_HEIGHT,109,
  273.  
  274.         /* our window settings */
  275.         WA_FLAGS,WFLG_DRAGBAR OR
  276.                  WFLG_DEPTHGADGET OR
  277.                  WFLG_CLOSEGADGET OR
  278.                  WFLG_ACTIVATE OR
  279.                  WFLG_SMART_REFRESH OR
  280.                  WFLG_NEWLOOKMENUS,
  281.  
  282.         /* what we want to know */
  283.         WA_IDCMP,SLIDERIDCMP OR
  284.                  IDCMP_MENUPICK OR
  285.                  IDCMP_CLOSEWINDOW OR
  286.                  IDCMP_REFRESHWINDOW,
  287.  
  288.         /* window title */
  289.         WA_TITLE,'Main Controls',
  290.  
  291.         /* window references */
  292.         WA_CUSTOMSCREEN,screen,
  293.         WA_GADGETS,maingadgetlist]),ERROR_NOWINDOW)
  294.  
  295.         /* initial refresh gadgets */
  296.         Gt_RefreshWindow(mainwindow,NIL)
  297.  
  298.         /* refresh window */
  299.         xRenderMainWindow()
  300.         
  301.         /* attach menu strip */
  302.         xCall(SetMenuStrip(mainwindow,mainmenus),ERROR_NOMENUSTRIP)
  303.  
  304.       /* window is opened succesfully */
  305.       RETURN TRUE
  306.     ENDIF
  307.   ENDIF
  308. EXCEPT
  309.  
  310.   /* clean up */
  311.   xCloseMainWindow()
  312.  
  313.   /* inform user */
  314.   xExceptionMessage(['Could not open window',
  315.                      'Could not attach menustrip'])
  316. ENDPROC
  317. PROC xCloseMainWindow()
  318.  
  319.   /* detach the menustrip */
  320.   IF mainwindow THEN ClearMenuStrip(mainwindow)
  321.  
  322.   /* free the menu structure */
  323.   IF mainmenus
  324.     FreeMenus(mainmenus)
  325.     mainmenus:=0
  326.   ENDIF
  327.  
  328.   /* close the window */
  329.   IF mainwindow
  330.     CloseWindow(mainwindow)
  331.     mainwindow:=0
  332.   ENDIF
  333.  
  334.   /* free the gadgetlist */
  335.   IF maingadgetlist
  336.     FreeGadgets(maingadgetlist)
  337.     maingadgetlist:=0
  338.   ENDIF
  339.  
  340. ENDPROC
  341. /* FEND */
  342. /* FOLDER "Gadgets" */
  343. PROC xCreateMainGadgets() HANDLE
  344.  
  345.   /* links gadgets */
  346.   DEF xgadget=0:PTR TO gadget
  347.  
  348.   /* create first context gadget */
  349.   xgadget:=xCall(CreateContext({maingadgetlist}),ERROR_NOCONTEXT)
  350.  
  351.   /* create 'reset' button */
  352.   maingadget[GADID_RESET]:=xCall(xgadget:=CreateGadgetA(BUTTON_KIND,xgadget,
  353.     [15,85,109,16,'_Reset',topaz,
  354.     GADID_RESET,PLACETEXT_IN,visual]:newgadget,
  355.     [GT_UNDERSCORE,"_"]),ERROR_NOGADGET)
  356.  
  357.   /* create 'code name' stringgadget */
  358.   maingadget[GADID_STRING]:=xCall(xgadget:=CreateGadgetA(STRING_KIND,xgadget,
  359.     [93,28,266,14,
  360.      'Just A Plain String Gadget',topaz,
  361.      GADID_STRING,PLACETEXT_ABOVE,visual,0]:newgadget,
  362.     [GTST_MAXCHARS,256,
  363.      GT_UNDERSCORE,"_",
  364.      GA_IMMEDIATE,TRUE]),ERROR_NOGADGET)
  365.  
  366.   /* create slider gadget */
  367.   maingadget[GADID_SLIDER]:=xCall(xgadget:=CreateGadgetA(SLIDER_KIND,xgadget,
  368.     [10,14,30,50,
  369.      'Spot',topaz,
  370.      GADID_SLIDER,PLACETEXT_RIGHT,visual,0]:newgadget,
  371.     [GTSL_MIN,1,
  372.      GTSL_MAX,4,
  373.      GTSL_LEVEL,1,
  374.      GTSL_MAXLEVELLEN,3,
  375.      GTSL_LEVELFORMAT,format,
  376.      GTSL_LEVELPLACE,PLACETEXT_BELOW,
  377.      PGA_FREEDOM,LORIENT_VERT,
  378.      GA_IMMEDIATE,TRUE,
  379.      GA_RELVERIFY,TRUE]),ERROR_NOGADGET)
  380.   RETURN TRUE
  381. EXCEPT
  382.  
  383.   /* free the gadgetlist */
  384.   FreeGadgets(maingadgetlist)
  385.   maingadgetlist:=0
  386.  
  387.   /* inform the user */
  388.   xExceptionMessage(['Could not create main gadgets context.',
  389.                      'Could not create a main gadget.'])
  390. ENDPROC
  391. /* FEND */
  392. /* FOLDER "Menus" */
  393. PROC xCreateMainMenus() HANDLE
  394.  
  395.   /* create menus */
  396.   mainmenus:=xCall(CreateMenusA([NM_TITLE,0,'Project',0,$0,0,0,
  397.     NM_ITEM,0,'Load...','L',$0,0,MENU_LOAD,
  398.     NM_ITEM,0,'Save...','S',$0,0,MENU_SAVE,
  399.     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  400.     NM_ITEM,0,'About...',0,0,0,MENU_ABOUT,
  401.     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  402.     NM_ITEM,0,'Quit','Q',$0,0,MENU_QUIT,
  403.     NM_TITLE,0,'Preferences',0,$0,0,0,
  404.     NM_ITEM,0,'Last Saved...',0,$0,0,MENU_LAST,
  405.     NM_END,0,0,0,0,0,0]:newmenu,NIL),ERROR_NOMENUS)
  406.  
  407.   /* layout menus */
  408.   xCall(LayoutMenusA(mainmenus,visual,[GTMN_NEWLOOKMENUS,TRUE]),ERROR_NOLAYOUT)
  409.  
  410.   /* menus created succesfully */
  411.   RETURN TRUE
  412. EXCEPT
  413.   /* clean up */
  414.   IF mainmenus
  415.     FreeMenus(mainmenus)
  416.     mainmenus:=0
  417.   ENDIF
  418.  
  419.   /* inform user */
  420.   xExceptionMessage(['Could not create main menus.',
  421.                      'Could not layout main menus.'])
  422. ENDPROC
  423. /* FEND */
  424. /* FOLDER "Render" */
  425. PROC xRenderMainWindow()
  426.   DrawBevelBoxA(mainwindow.rport,
  427.                 mainwindow.borderleft,
  428.                 mainwindow.bordertop,
  429.                 mainwindow.width-mainwindow.borderright-mainwindow.borderleft,
  430.                 mainwindow.height-mainwindow.bordertop-mainwindow.borderbottom,
  431.                 [GT_VISUALINFO,visual])
  432. ENDPROC
  433. /* FEND */
  434. /* FOLDER "Handle" */
  435.  
  436. PROC xHandleMainMessages()
  437.  
  438.   /* message pointer and body */
  439.   DEF message:PTR TO intuimessage
  440.   DEF class,code,address
  441.  
  442.   /* clicked gadget and id */
  443.   DEF clicked:PTR TO gadget
  444.   DEF gadgetid
  445.  
  446.   /* process one message at a time */
  447.   WHILE message:=Gt_GetIMsg(mainwindow.userport)
  448.  
  449.     /* copy message */
  450.     class:=message.class
  451.     code:=message.code
  452.     address:=message.iaddress
  453.  
  454.     /* reply message */
  455.     Gt_ReplyIMsg(message)
  456.  
  457.     /* what happened? */
  458.     SELECT class
  459.  
  460.     /* gadget released? */
  461.     CASE IDCMP_GADGETUP
  462.       clicked:=address
  463.       gadgetid:=clicked.gadgetid
  464.       SELECT gadgetid
  465.       CASE GADID_RESET
  466.         FOR gadgetid:=0 TO 23
  467.           IF slidervalue[gadgetid]<>127
  468.             slidervalue[gadgetid]:=127
  469.             Gt_SetGadgetAttrsA(slidergadget[gadgetid],sliderwindow,0,[GTSL_LEVEL,127])
  470.           ENDIF
  471.         ENDFOR
  472.         WriteF('Reset done.\n')
  473.       CASE GADID_STRING
  474.         WriteF('String deactivated.\n')
  475.       CASE GADID_SLIDER
  476.         WriteF('Slider released.\n')
  477.       ENDSELECT
  478.  
  479.     /* gadget pressed? */
  480.     CASE IDCMP_GADGETDOWN
  481.       clicked:=address
  482.       gadgetid:=clicked.gadgetid
  483.       SELECT gadgetid
  484.       CASE GADID_RESET
  485.       CASE GADID_STRING
  486.       CASE GADID_SLIDER
  487.         WriteF('Slider pressed.\n')
  488.       ENDSELECT
  489.  
  490.     /* slider in use? */
  491.     CASE IDCMP_MOUSEMOVE
  492.       clicked:=address
  493.       gadgetid:=clicked.gadgetid
  494.       WriteF('Mouse moved.\n')
  495.  
  496.     /* menu item picked? */
  497.     CASE IDCMP_MENUPICK
  498.       WriteF('class=$\h\n',class)
  499.       WriteF('code=$\h\n',code)
  500.       WriteF('address=$\h\n',address)
  501.       WriteF('No gadget...\n')
  502.  
  503.     /* closegadget? */
  504.     CASE IDCMP_CLOSEWINDOW
  505.       quitflag:=TRUE
  506.  
  507.     /* refresh window? */
  508.     CASE IDCMP_REFRESHWINDOW
  509.       xRenderMainWindow()
  510.  
  511.     ENDSELECT
  512.   ENDWHILE
  513. ENDPROC
  514. /* FEND */
  515. /* FEND */
  516. /* FOLDER "Slider Window" */
  517. /* ~~~~~~~~~~~~~~~~~~~~~~ */
  518. /* FOLDER "Open" */
  519. PROC xOpenSliderWindow() HANDLE
  520.  
  521.   /* gadgets made? */
  522.   IF xCreateSliderGadgets()
  523.  
  524.     /* menus made? */
  525.     IF xCreateSliderMenus()
  526.  
  527.       /* open window */
  528.       sliderwindow:=xCall(OpenWindowTagList(NIL,
  529.  
  530.         /* window position and size */
  531.        [WA_LEFT,0,
  532.         WA_TOP,62,
  533.         WA_WIDTH,screen.width,
  534.         WA_HEIGHT,sli_height+WIN_TOP+BOX_YOFF+1+SLI_YOFF+SLI_YOFF+1+BOX_YOFF+WIN_BOTTOM,
  535.         WA_MINWIDTH,screen.width,
  536.         WA_MAXWIDTH,screen.width,
  537.         WA_MINHEIGHT,WIN_TOP+BOX_YOFF+1+SLI_YOFF+28+SLI_YOFF+1+BOX_YOFF+WIN_BOTTOM,
  538.         WA_MAXHEIGHT,screen.height,
  539.  
  540.  
  541.         /* our window settings */
  542.         WA_FLAGS,WFLG_DRAGBAR OR
  543.                  WFLG_CLOSEGADGET OR
  544.                  WFLG_ACTIVATE OR
  545.                  WFLG_SMART_REFRESH OR
  546.                  WFLG_SIZEGADGET OR
  547.                  WFLG_SIZEBBOTTOM OR
  548.                  WFLG_NEWLOOKMENUS,
  549.  
  550.         /* what we want to know */
  551.         WA_IDCMP,SLIDERIDCMP OR
  552.                  IDCMP_CLOSEWINDOW OR
  553.                  IDCMP_NEWSIZE OR
  554.                  IDCMP_REFRESHWINDOW,
  555.  
  556.         /* window title */
  557.         WA_TITLE,'Slider Panel',
  558.  
  559.         /* window references */
  560.         WA_CUSTOMSCREEN,screen,
  561.         WA_GADGETS,slidergadgetlist]),ERROR_NOWINDOW)
  562.  
  563.         /* initial window refresh */
  564.         Gt_RefreshWindow(sliderwindow,NIL)
  565.  
  566.         /* render window */
  567.         xRenderSliderWindow()
  568.  
  569.         /* attach menu strip */
  570.         xCall(SetMenuStrip(sliderwindow,slidermenus),ERROR_NOMENUSTRIP)
  571.  
  572.       /* window is opened succesfully */
  573.       RETURN TRUE
  574.     ENDIF
  575.   ENDIF
  576. EXCEPT
  577.  
  578.   /* clean up */
  579.   xCloseSliderWindow()
  580.  
  581.   /* inform user */
  582.   xExceptionMessage(['Could not open slider window',
  583.                      'Could not attach menustrip'])
  584. ENDPROC
  585. PROC xCloseSliderWindow()
  586.  
  587.   /* detach the menustrip */
  588.   IF sliderwindow THEN ClearMenuStrip(sliderwindow)
  589.  
  590.   /* free the menu structure */
  591.   IF slidermenus
  592.     FreeMenus(slidermenus)
  593.     slidermenus:=0
  594.   ENDIF
  595.  
  596.   /* close the window */
  597.   IF sliderwindow
  598.     CloseWindow(sliderwindow)
  599.     sliderwindow:=0
  600.   ENDIF
  601.  
  602.   /* free the gadgetlist */
  603.   IF slidergadgetlist
  604.     FreeGadgets(slidergadgetlist)
  605.     slidergadgetlist:=0
  606.   ENDIF
  607.  
  608. ENDPROC
  609. /* FEND */
  610. /* FOLDER "Gadgets" */
  611. PROC xCreateSliderGadgets() HANDLE
  612.  
  613.   /* links gadgets */
  614.   DEF xgadget=0:PTR TO gadget
  615.  
  616.   /* run through groups and sliders */
  617.   DEF xgroup,xslider,xnum=0,xpos
  618.  
  619.   /* create first context gadget */
  620.   xgadget:=xCall(CreateContext({slidergadgetlist}),ERROR_NOCONTEXT)
  621.  
  622.   xpos:=WIN_LEFT+BOX_XOFF+2+SLI_XOFF
  623.  
  624.   /* build sliders */
  625.   FOR xgroup:=0 TO 3
  626.     FOR xslider:=0 TO 5
  627.       /* create slider gadget */
  628.       slidergadget[xnum]:=xCall(xgadget:=CreateGadgetA(SLIDER_KIND,xgadget,
  629.         [xpos,WIN_TOP+BOX_YOFF+1+SLI_YOFF,SLI_WIDTH,sli_height,
  630.          0,topaz,xnum,PLACETEXT_ABOVE,visual,0]:newgadget,
  631.         [GTSL_MIN,0,
  632.          GTSL_MAX,255,
  633.          GTSL_LEVEL,slidervalue[xnum],
  634.          PGA_FREEDOM,LORIENT_VERT,
  635.          GA_IMMEDIATE,TRUE,
  636.          GA_RELVERIFY,TRUE]),ERROR_NOGADGET)
  637.       /* increase gadgetnumber */
  638.       INC xnum
  639.       /* add x gadget offset */
  640.       ADD.L #SLI_WIDTH+SLI_GAP,xpos
  641.     ENDFOR
  642.     /* add x group gap */
  643.     ADD.L #-SLI_GAP+2+SLI_XOFF+BOX_GAP+2+SLI_XOFF,xpos
  644.   ENDFOR
  645.   RETURN TRUE
  646. EXCEPT
  647.  
  648.   /* free the gadgetlist */
  649.   FreeGadgets(slidergadgetlist)
  650.   slidergadgetlist:=0
  651.  
  652.   /* inform the user */
  653.   xExceptionMessage(['Could not create slider gadgets context.',
  654.                      'Could not create a slider.'])
  655. ENDPROC
  656. /* FEND */
  657. /* FOLDER "Menus" */
  658. PROC xCreateSliderMenus() HANDLE
  659.  
  660.   /* create menus */
  661.   slidermenus:=xCall(CreateMenusA([NM_TITLE,0,'Project',0,$0,0,0,
  662.     NM_ITEM,0,'Load...','L',$0,0,MENU_LOAD,
  663.     NM_ITEM,0,'Save...','S',$0,0,MENU_SAVE,
  664.     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  665.     NM_ITEM,0,'About...',0,0,0,MENU_ABOUT,
  666.     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  667.     NM_ITEM,0,'Quit','Q',$0,0,MENU_QUIT,
  668.     NM_TITLE,0,'Sliders',0,$0,0,0,
  669.     NM_ITEM,0,'50%...',0,$0,0,MENU_LAST,
  670.     NM_END,0,0,0,0,0,0]:newmenu,NIL),ERROR_NOMENUS)
  671.  
  672.   /* layout menus */
  673.   xCall(LayoutMenusA(slidermenus,visual,[GTMN_NEWLOOKMENUS,TRUE]),ERROR_NOLAYOUT)
  674.  
  675.   /* menus created succesfully */
  676.   RETURN TRUE
  677. EXCEPT
  678.   /* clean up */
  679.   IF slidermenus
  680.     FreeMenus(slidermenus)
  681.     slidermenus:=0
  682.   ENDIF
  683.  
  684.   /* inform user */
  685.   xExceptionMessage(['Could not create slider menus.',
  686.                      'Could not layout slider menus.'])
  687. ENDPROC
  688. /* FEND */
  689. /* FOLDER "Render" */
  690. PROC xRenderSliderWindow()
  691.   DEF box,level,indent
  692.   /*
  693.   DrawBevelBoxA(sliderwindow.rport,
  694.                 WIN_LEFT,
  695.                 WIN_TOP,
  696.                 BOX_XOFF+((SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)*4)+(BOX_GAP*3)+BOX_XOFF,
  697.                 BOX_YOFF+1+SLI_YOFF+sli_height+SLI_YOFF+1+BOX_YOFF,
  698.                 [GT_VISUALINFO,visual,0,0])
  699.   */
  700.   FOR box:=0 TO 3
  701.     DrawBevelBoxA(sliderwindow.rport,
  702.                   WIN_LEFT+BOX_XOFF+(((SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+BOX_GAP)*box),
  703.                   WIN_TOP+BOX_YOFF,
  704.                   (SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4),
  705.                   1+SLI_YOFF+sli_height+SLI_YOFF+1,
  706.                   [GT_VISUALINFO,visual,
  707.                    GTBB_RECESSED,TRUE,0,0])
  708.   ENDFOR
  709.   stdrast:=sliderwindow.rport
  710.   FOR box:=0 TO 2
  711.     DrawBevelBoxA(sliderwindow.rport,
  712.                   WIN_LEFT+BOX_XOFF+(SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+(((SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+BOX_GAP)*box),
  713.                   WIN_TOP+BOX_YOFF,
  714.                   BOX_GAP,
  715.                   1+SLI_YOFF+sli_height+SLI_YOFF+1,
  716.                   [GT_VISUALINFO,visual,
  717.                    GTBB_RECESSED,TRUE,0,0])
  718.     FOR level:=0 TO 10
  719.       SELECT level
  720.       CASE 0
  721.         indent:=0
  722.       CASE 5
  723.         indent:=1
  724.       CASE 10
  725.         indent:=0
  726.       DEFAULT
  727.         indent:=2
  728.       ENDSELECT
  729.       Line(WIN_LEFT+BOX_XOFF+(SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+2+indent+(((SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+BOX_GAP)*box),
  730.            WIN_TOP+BOX_YOFF+SLI_YOFF+4+(((sli_height-8)*level)/10),
  731.            WIN_LEFT+BOX_XOFF+(SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+BOX_GAP-3-indent+(((SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+BOX_GAP)*box),
  732.            WIN_TOP+BOX_YOFF+SLI_YOFF+4+(((sli_height-8)*level)/10),1)
  733.  
  734.       /* graphics.library's 'Line' equivalent */
  735.       /*
  736.       Move(sliderwindow.rport,WIN_LEFT+BOX_XOFF+(SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+2+indent+(((SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+BOX_GAP)*box),WIN_TOP+BOX_YOFF+SLI_YOFF+4+(((sli_height-8)*level)/10))
  737.       Draw(sliderwindow.rport,WIN_LEFT+BOX_XOFF+(SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+BOX_GAP-3-indent+(((SLI_WIDTH+SLI_GAP*5+SLI_WIDTH+SLI_XOFF+SLI_XOFF+4)+BOX_GAP)*box),WIN_TOP+BOX_YOFF+SLI_YOFF+4+(((sli_height-8)*level)/10))
  738.       */
  739.   ENDFOR
  740. ENDFOR
  741.  
  742. ENDPROC
  743. /* FEND */
  744. /* FOLDER "Handle" */
  745.  
  746. PROC xHandleSliderMessages()
  747.  
  748.   /* message pointer and body */
  749.   DEF message:PTR TO intuimessage
  750.   DEF class,code,address
  751.  
  752.   /* clicked gadget and id */
  753.   DEF clicked:PTR TO gadget
  754.   DEF gadgetid
  755.  
  756.   /* process one message at a time */
  757.   WHILE message:=Gt_GetIMsg(sliderwindow.userport)
  758.  
  759.     /* copy message */
  760.     class:=message.class
  761.     code:=message.code
  762.     address:=message.iaddress
  763.  
  764.     /* what happened? */
  765.     SELECT class
  766.  
  767.     /* gadget released? */
  768.     CASE IDCMP_GADGETUP
  769.       clicked:=address
  770.       gadgetid:=clicked.gadgetid
  771.       slidervalue[gadgetid]:=code
  772.       WriteF('slider #\d released on \z\d[3].\b',gadgetid,code)
  773.  
  774.     /* gadget pressed? */
  775.     CASE IDCMP_GADGETDOWN
  776.       clicked:=address
  777.       gadgetid:=clicked.gadgetid
  778.       WriteF('slider #\d pressed.         \b',gadgetid)
  779.       
  780.     CASE IDCMP_MOUSEMOVE
  781.       clicked:=address
  782.       gadgetid:=clicked.gadgetid
  783.       WriteF('slider #\d moved to \z\d[3].\b',gadgetid,code)
  784.     
  785.     /* menu item picked? */
  786.     CASE IDCMP_MENUPICK
  787.  
  788.     /* closegadget? */
  789.     CASE IDCMP_CLOSEWINDOW
  790.       WriteF('\n')
  791.       quitflag:=TRUE
  792.  
  793.     /* window resized? */
  794.     CASE IDCMP_NEWSIZE
  795.  
  796.       /* clean window area */
  797.       SetAPen(sliderwindow.rport,0)
  798.       RectFill(sliderwindow.rport,WIN_LEFT,WIN_TOP,sliderwindow.width-sliderwindow.borderright-1,sliderwindow.height-sliderwindow.borderbottom-1)
  799.  
  800.       /* calculate new sliderheight */
  801.       sli_height:=Div(sliderwindow.height-WIN_TOP-BOX_YOFF-1-SLI_YOFF-SLI_YOFF-1-BOX_YOFF-WIN_BOTTOM-8,10)*10+8
  802.  
  803.       /* and change the sliders */
  804.       FOR gadgetid:=0 TO 23
  805.         clicked:=slidergadget[gadgetid]
  806.         clicked.height:=sli_height-4
  807.       ENDFOR
  808.  
  809.       /* refresh and repair window */
  810.       RefreshWindowFrame(sliderwindow)
  811.       Gt_RefreshWindow(sliderwindow,NIL)
  812.  
  813.     /* refresh window? */
  814.     CASE IDCMP_REFRESHWINDOW
  815.  
  816.       /* re-render window */
  817.       /*
  818.       Gt_BeginRefresh(sliderwindow)
  819.       Gt_EndRefresh(sliderwindow,TRUE)
  820.       */
  821.       xRenderSliderWindow()
  822.  
  823.     ENDSELECT
  824.     /* reply message */
  825.     Gt_ReplyIMsg(message)
  826.  
  827.   ENDWHILE
  828. ENDPROC
  829. /* FEND */
  830. /* FEND */
  831.  
  832. /* FOLDER "Libraries" */
  833. PROC xOpenSpotLiteLibraries() HANDLE
  834.  
  835.   /* open libraries */
  836.   gadtoolsbase:=xCall(OpenLibrary('gadtools.library',37),ERROR_NOGADTOOLS)
  837.  
  838.   /* all libs opened succesfully */
  839.   RETURN TRUE
  840.  
  841. EXCEPT
  842.  
  843.   /* cleanup */
  844.   xCloseSpotLiteLibraries()
  845.  
  846.   /* inform user */
  847.   xExceptionMessage(['Could not open gadtools.library'])
  848.  
  849. ENDPROC
  850. PROC xCloseSpotLiteLibraries()
  851.   /* gadtools? */
  852.   IF gadtoolsbase
  853.     /* close gadtools */
  854.     CloseLibrary(gadtoolsbase)
  855.     gadtoolsbase:=0
  856.   ENDIF
  857. ENDPROC
  858. /* FEND */
  859. /* FOLDER "History" */
  860. /*
  861.  
  862. History of 'SpotLite', copyrights © 1993 by Leon Woestenberg
  863. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  864.  
  865. Global Info: SpotLite is written by Leon Woestenberg using the
  866. ~~~~~~~~~~~~ Amiga E compiler version 2.1b by Wouter van Oortmerssen.
  867.  
  868. Spotlite Introduction
  869. ~~~~~~~~~~~~~~~~~~~~~
  870. Spotlite is a project for an Amiga controlled 'Spotlights Mix Panel' which
  871. is used in theatres and such. This should be able to fully edit and record
  872. a light show appearance. Because it has to run on a first generation Amiga
  873. 500 upgraded with 2.04 Kickstart, efficiency has to be high. Therefore,
  874. the E language was a good choice for me. I'm just a beginner in programming
  875. the Amiga and I by releasing this source code, I hope I can help other
  876. beginners out by showing the basic stuff of Intuition and Amiga E.
  877.  
  878. Disclaimer
  879. ~~~~~~~~~~
  880. I do not claim (so I disclaim) that this code is fully compliant with THE
  881. rules. To my humble knowledge, it is, and if you think different, let me
  882. know, because my aim is to learn a neat way of programming the Amiga!
  883.  
  884. v0.01 (18-Sep-93)
  885. ~~~~~~~~~~~~~~~~~
  886. - Begin of project, mainly adapting GUI functions and cleaning them up.
  887. - Added folders (for GoldEd) and comments to almost every line of code.
  888. - Problems:
  889.   a) Screen doesn't copy 'HIRES_KEY' from Workbench settings.
  890.   b) The slider gadget shows it's format string instead of level.
  891.  
  892. v0.02 (21-Sep-93)
  893. ~~~~~~~~~~~~~~~~~
  894. - Started adding an appropriate GUI interface for spotlight controls.
  895. - Saved 24 bytes by using a VOID before the version string.
  896. - Saved even more bytes by defining a global textattribute pointer.
  897. - Still unsure about which window refresh method to use: smart or simple?
  898. - Added opening on Workbench screen, and made entry procedure for opening.
  899. Problems:
  900.   c) Furthermore I want the slider values to update while dragging, as well
  901.     as being able to hear when user presses and releases slidergadget.
  902. Solutions:
  903.   c) After studying the intuition constants, the last problem is solved:
  904.      SLIDERIDCMP is a total of IDCMP_GADGETUP, IDCMP_GADGETDOWN and
  905.      IDCMP_MOUSEMOVE. As I was using '+' instead of 'OR' in defining the
  906.      IDCMP mask, things screw up (as $70 + $20 is not equal to $70 OR $20).
  907.   b) The GTSL_LEVELFORMAT tag needed a stringpointer (STRPTR in C) and I
  908.      supplied a normal pointer (oops!). But I took revenge by sending it an
  909.      e-string pointer which is far superior (but downwards compatible...:-).
  910.  
  911. v0.03 (27-Sep-93)
  912. ~~~~~~~~~~~~~~~~~
  913. - Building nice slider window with many, many gadgets. Space might be too 
  914.   small when not using (horizontal) overscan or borderless windows...
  915. - Added constants which define the slider window layout. Offsets, gaps and
  916.   sizes of boxes and sliders are adjustable and prepared for y-scalebility.
  917. - Removed a bug that caused the sliders to appear shifted from the boxes when
  918.   the slidergap was non zero. A groups last gadget gap was added to the next.
  919. - Looks like a have to get a registered version of GoldED real quick now, as
  920.   the sourcecode is going to grow over the 1000 lines limit.
  921. - Changed the graphics.library's 'Move' and 'Draw' instructions to AmigaE's
  922.   'Line' instruction, which is a small decrease in length (increased speed?).
  923. Problems:
  924.   d) Cannot get the resize/refresh routines to work properly, as someway the
  925.      system re-renders the slider settings before I've resized the sliders.
  926. Solutions:
  927.   b) It seemed that the formatstring must be a global variable, to which
  928.      RawDoFmt() will refer during gadget updating. Problem solved now.
  929.   d) Re-render routines were much to complex by doing window resizing to get
  930.      a nice scale graphic. Influenced by Reqtools' filerequester scaling I
  931.      now only rescale slider gadgets and leave the window as it is.
  932.   e) Re-sizeing routines do not work under 3.x. Sliders are displayed with
  933.      original height. Need some example code or Kernel Reference Manuals.
  934.  
  935. v0.04 (8-Dec-93)
  936. ~~~~~~~~~~~~~~~~
  937. - I received my registered GoldED from Dietmar Eilert within two weeks!
  938.   Now I can continue exceeding the 1000 lines limit with this source code.
  939. - Released this code onto Aminet in dev/e for as an example E source for
  940.   beginners in both Intuition and Amiga E.
  941. */
  942. /* FEND */
  943.  
  944. /* FOLDER "xExceptionMessage" */
  945. PROC xExceptionMessage(xmessagelist)
  946.  
  947.   /* display an personal message requester with OK button */
  948.   EasyRequestArgs(mainwindow,[SIZEOF easystruct,0,'SpotLight Information',ListItem(xmessagelist,exception),'OK'],0,NIL)
  949.  
  950. ENDPROC
  951. /* FEND */
  952. /* FOLDER "xCall" */
  953. PROC xCall(xreturncode,xexception)
  954.  
  955.   /* function failed? */
  956.   IF xreturncode=NIL
  957.  
  958.     /* raise exception */
  959.     Raise(xexception)
  960.  
  961.   ENDIF
  962.  
  963. ENDPROC xreturncode
  964. /* FEND */
  965.